www.gusucode.com > VC++ 编写软件自动升级服务源代码 > VC++ 编写软件自动升级服务源代码/gusucode/updater_src0.8.1.6/RollbackInfo.cpp

    /********************************************************************
	created:	2005/03/02
	created:	2:3:2005   13:29
	filename: 	RollbackInfo.cpp
	file path:	Updater
	file base:	RollbackInfo
	file ext:	cpp
	author:		Geert van Horrik
	
	purpose:	
*********************************************************************/

//*********************************************************************
// INCLUDES
//*********************************************************************

#include "stdafx.h"
#include "Updater.h"
#include "RollbackInfo.h"

//*********************************************************************
// INITIALISATION
//*********************************************************************

std::auto_ptr<CRollbackInfo> CRollbackInfo::sm_inst;

//*********************************************************************
// CONSTRUCTOR & DESTRUCTOR
//*********************************************************************

CRollbackInfo::CRollbackInfo()
{
	// Set some values
	m_iRollbackActionCount = 0;
}

//*********************************************************************
// PUBLIC FUNCTIONS
//*********************************************************************

CRollbackInfo * CRollbackInfo::Instance()
{
	if(sm_inst.get() == 0)
		sm_inst = auto_ptr<CRollbackInfo>(new CRollbackInfo);
	return sm_inst.get();

	/* FOLLOWING CODE WORKS ONLY IN VC7
	if(sm_inst.get() == 0)
		sm_inst.reset(new CRollbackInfo);
	return sm_inst.get();
	*/
}

//=====================================================================

CRollbackActionBase * CRollbackInfo::GetAction(int iIndex)
{
	// Return action
	return m_arrRollbackActions[iIndex];
}

//=====================================================================

void CRollbackInfo::AddAction(CRollbackActionBase * pAction)
{
	// Declare variables
	bool bValid = false;

	// Check what type of action to add
	switch (pAction->GetType())
	{
	case ROLLBACKACTION_COPY:
		if (IsValidActionCopy(pAction))
			bValid = true;
		break;

	case ROLLBACKACTION_DELETE:
		if (IsValidActionDelete(pAction))
			bValid = true;
		break;

	case ROLLBACKACTION_REGISTRY:
		// Always perform registry actions
		bValid = true;
		break;

	case ROLLBACKACTION_UNREGISTER:
		// Always perform unregister actions
		bValid = true;
		break;
	}	

	// Add action to array
	if (bValid)
		m_arrRollbackActions[m_iRollbackActionCount++] = pAction;
}

//=====================================================================

void CRollbackInfo::AddActionCopy(CString sOldLocation, CString sNewLocation)
{
	// Set up information
	CRollbackActionBase * pAction = new CRollbackActionCopy(sOldLocation, sNewLocation);

	// Add to array
	AddAction(pAction);
}

//=====================================================================

void CRollbackInfo::AddActionDelete(CString sLocation)
{
	// Set up information
	CRollbackActionBase * pAction = new CRollbackActionDelete(sLocation);
	
	// Add to array
	AddAction(pAction);
}

//=====================================================================

void CRollbackInfo::AddActionRegistry(CString sKey, CString sValue)
{
	// Set up information
	CRollbackActionBase * pAction = new CRollbackActionRegistry(sKey, sValue);
	
	// Add to array
	AddAction(pAction);
}

//=====================================================================

void CRollbackInfo::AddActionUnregister(CString sFile)
{
	// Set up information
	CRollbackActionBase * pAction = new CRollbackActionUnregister(sFile);
	
	// Add to array
	AddAction(pAction);
}

//=====================================================================

int CRollbackInfo::GetActionCount()
{
	// Return value
	return m_iRollbackActionCount;
}

//=====================================================================

void CRollbackInfo::CleanUp()
{
	// Delete all rollback actions
	for (int i = 0; i < m_iRollbackActionCount; i++)
	{
		// Delete object
		delete m_arrRollbackActions[i];
	}
}

//*********************************************************************
// PRIVATE FUNCTIONS
//*********************************************************************

bool CRollbackInfo::IsValidActionCopy(CRollbackActionBase * pAction)
{
	// Declare variables
	CRollbackActionCopy * pTemp;
	bool bValid = true;

	// Get object
	CRollbackActionCopy * pCopy = (CRollbackActionCopy *)pAction;

	// Check if file isn't already in to be copied
	for (int i = 0; i < GetActionCount(); i++)
	{
		if (GetAction(i)->GetType() == ROLLBACKACTION_COPY)
		{
			// Get temp object
			pTemp = (CRollbackActionCopy *)GetAction(i);

			// Check if file isn't already begin copied
			if (pCopy->GetNewLocation() == pTemp->GetNewLocation())
				bValid = false;
		}
	}

	// Return value
	return bValid;
}

//=====================================================================

bool CRollbackInfo::IsValidActionDelete(CRollbackActionBase * pAction)
{
	// Declare variables
	CRollbackActionDelete * pTemp;
	bool bValid = true;
	
	// Get object
	CRollbackActionDelete * pDelete = (CRollbackActionDelete *)pAction;
	
	// Check if file isn't already in to be copied
	for (int i = 0; i < GetActionCount(); i++)
	{
		if (GetAction(i)->GetType() == ROLLBACKACTION_DELETE)
		{
			// Get temp object
			pTemp = (CRollbackActionDelete *)GetAction(i);
			
			// Check if file isn't already being deleted
			if (pDelete->GetLocation() == pTemp->GetLocation())
				bValid = false;
		}
	}
	
	// Return value
	return bValid;
}